package com.h117121.fashionshop.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import com.h117121.fashionshop.core.dom.ProductQuery;

public class ProductQueryValidator implements Validator {

	@SuppressWarnings("rawtypes")
	@Override
	public boolean supports(Class clazz) {
		return ProductQuery.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
		ProductQuery query = (ProductQuery) target;
		if (query.getKeyWord() != null) {
			ValidationUtils.rejectIfEmptyOrWhitespace(errors, "keyWord",
					"empty.keyWord", "Vui lòng nhập từ khóa.");
		} else {
			if (errors.hasErrors())
				return;

			if (query.getPriceFrom() == null
					&& query.getPriceTo() == null
					&& (query.getProducerName() == null || query
							.getProducerName().isEmpty())
					&& (query.getProductMadein() == null || query
							.getProductMadein().isEmpty())
					&& (query.getProductName() == null || query
							.getProductName().isEmpty())
					&& (query.getProductType() == null || query
							.getProductType().isEmpty())) {
				errors.reject("empty.query",
						"Ít nhất bạn phải cung cấp một thông tin để có thể tìm kiếm được.");
			} else {
				if (query.getPriceFrom() != null && query.getPriceTo() != null) {
					if (query.getPriceFrom() > query.getPriceTo()) {
						errors.rejectValue("priceFrom", "invalid.fromtoprice",
								"Khoảng giá bạn nhập không hợp lệ.");
					}
				}

				if (query.getPriceFrom() != null) {
					if (query.getPriceFrom() < 0) {
						errors.rejectValue("priceFrom", "invalid.price",
								"Giá không thể là số âm.");
					}
				}

				if (query.getPriceTo() != null) {
					if (query.getPriceTo() < 0) {
						errors.rejectValue("priceTo", "invalid.price",
								"Giá không thể là số âm.");
					}
				}
			}
		}

	}

}
